#include <stdio.h>
#include <stdlib.h>

void allocateMemory(int **ptr)
{
  // *ptr ：对二级指针 ptr 解引用一次，得到的是 ptr 所指向的内容-也就是 p（因为 ptr 存的是 &p，解引用后就是 p 本身）。
  // 所以 *ptr 和 p 是等价的，类型是 int *（一级指针类型）。

  //   总结对应关系
  //      &p 对应 ptr：ptr 存储的是 &p（p 的地址）。
  //      p 对应 *ptr：对 ptr 解引用一次（*ptr），得到的就是 p（p 的地址）。
  //      *p 对应 **ptr：对 ptr 解引用两次（**ptr），得到的就是 *p（p 所指向的 int 变量的值）。
  *ptr = (int *)malloc(sizeof(int));
  if (*ptr != NULL)
  {
    **ptr = 42; // 为分配的内存赋值
  }
}

int main()
{
  int *p = NULL;
  allocateMemory(&p);

  if (p != NULL)
  {
    printf("%d\n", *p);
    // 释放内存
    free(p);
  }

  return 0;
}